/*
 * @Description: 自定义rs485串口modbus工具
 * @Date: 2024-10-15 10:51:56
 *
 * 函数说明 client.writeRegisters(startAddress, values, [callback]);
 * startAddress：起始寄存器地址，类型为整数。
 * values：要写入的寄存器值数组，类型为数组。数组中的每个元素对应一个寄存器的值。
 * callback（可选）：回调函数，当操作完成时调用。回调函数的签名通常是 (err, data)，其中 err 是错误对象（如果有错误发生），data 是操作的结果
 */
import { ipcMain } from 'electron';
import ModbusRTU from 'modbus-serial';

interface modbusData {
  serialName: string;
  slaveId: number;
  startAddres: number;
  transData: string;
}

let sendData: modbusData = {
  serialName: '',
  slaveId: 0,
  startAddres: 0,
  transData: '',
};

// 创建一个 Modbus 客户端
const client = new ModbusRTU();

// 监听web端发送的值,并创建连接
ipcMain.on('serialModbus:creatConnection', async (_event, data) => {
  try {
    await client.connectRTUBuffered(data, { baudRate: 9600 });
    console.log('Modbus 连接成功');
  } catch (error) {
    console.error('Modbus 连接失败:', error);
  }
});

// 监听web端发送的值
ipcMain.on('serialModbus:send', async (event, data) => {
  console.log('node接受到的web端发送的值: ', data);
  sendData = data;

  try {
    // 设备的从机地址（也称为设备地址或从机ID）
    client.setID(sendData.slaveId);

    // 从指定的寄存器起始地址写入数据组
    await client.writeRegisters(sendData.startAddres, sendData.transData.split(',').map(Number));
    read();
  } catch (error) {
    console.error('------》》》写入寄存器错误Error writing registers:', error);
  }

  function read() {
    client
      .readHoldingRegisters(0, 10)
      .then((result) => {
        console.log('result: ', result);
        // 将数据发送回渲染进程
        event.reply('serialModbus:reply', result);
      })
      .catch((err) => console.error('------》》》读取寄存器错误Error reading registers:', err));
  }
});
